package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
//引入外部配置文件，设置动态的变量赋值
@PropertySource("classpath:/image.properties")
public class FileServiceImpl implements FileService{

    @Value("${file.localDirPath}")
    private String localDirPath;

   @Value("${file.preURLPath}")
    private  String preURLPath;
    /*
    @Override
    public void upload(MultipartFile file) {

        String filePath="D:/vue/imgaes/";
        File fileDir=new File(filePath);

        //判断目录是否存在
        if (!fileDir.exists()) {

            fileDir.mkdirs();//创建多级目录

        }
        //获取文件名称
       String fileName= file.getOriginalFilename();
      //文件上传目录路径
        String path=filePath  + fileName;
        //实现文件上传
        try {
        //调用文件的方法将文件上传至文件夹中
            file.transferTo(new File(path));
        } catch (IOException e) {
            e.printStackTrace();
            //将异常信息和运行时异常一起抛出
            throw new RuntimeException(e);
        }

    }*/

    /* 校验图片的类型是否正常

    *
    * */


    @Override
    public ImageVO upload(MultipartFile file) {
     //校验图片的类型。正则表达式
     //获取文件名称
     String fileName=file.getOriginalFilename();
     //防止用户传经来的是大写的文件名
        fileName=fileName.toLowerCase();
     //正则校验,以^开始$结束
        if (!fileName.matches("^.+\\.(jpg|png|gif)$")) {
          //如果文件不符合，返回null
            return null;
        }
      //校验文件是否为恶意程序。将文件转换为图片对象,获取高度和宽度
        try {
         BufferedImage bufferedImage= ImageIO.read(file.getInputStream());
         int heght=bufferedImage.getHeight();
         int width=bufferedImage.getWidth();
            if (width ==0||width==0) {
                 return null;
            }

            //实现分目录存储
          String dateDirPath=  new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
          String localDir=localDirPath +dateDirPath;
          File dirfile=new File(localDir);

            if (!dirfile.exists()) { //如果没有目录就创建一个
              dirfile.mkdirs();

            }
            //防止文件重名 uuid
            String uuid= UUID.randomUUID().toString()
                    .replace("-", "");
           //获取文件的最后一个点，进行图片的名字的字符串截取，获取文件名后缀
            int index=fileName.lastIndexOf(".");
            String fileType=fileName.substring(index);

            String realFileName=uuid+fileType;

            //5实现文件的上传
            //获取文件名
           String locaFilePath= localDir +realFileName;
             //文件上传
            file.transferTo(new File(locaFilePath));

            //imagevo对象的三个参数
             String virtualPath=dateDirPath+realFileName;//磁盘路径
            String urlPath=preURLPath+virtualPath;   //虚拟地址
           //String fileName;//文件名称
           return new ImageVO(virtualPath,urlPath,realFileName);


        } catch (IOException e) {
            e.printStackTrace();
            return  null;//终止程序
        }





    }
  //准备文件的全路径，在删除
      @Override
    public void deleteFile(String virtualPath) {
       //我们的磁盘路径+虚拟地址
        String path = localDirPath+virtualPath;
        File file=new File(path);
        //执行删除
        file.delete();

    }


}
